2022年02月02日
川俣晶の縁側ソフトウェアnew_C#入門・全キーワード明快解説! total 1038 count

baseキーワード: 基底クラスのメンバーにアクセスせよ!

Written By: 川俣 晶連絡先

この章のテーマ §

 baseキーワードについて学びます。baseキーワードの機能は主に2つあります。

前提知識 §

Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, クラスの基礎、継承の基礎、コンストラクタの基礎、thisキーワード

解説 §

 baseキーワードの役割は2つあります。

 一つは、基底クラスにアクセスする方法です。thisを使うと【このインスタンス】にアクセスできますが、thisの代わりにbaseを使うと、【このインスタンスを基底クラスとして使う】に機能が変化します。これで継承の際に上書きしてしまった場合でも、上書き前の機能を使用できます。

 もう1つは、基底クラスのコンストラクタへのアクセスです。コンストラクタでthisの代わりにbaseを使うと、その引数の基底クラスのコンストラクタを呼び出すことができいます。引数が異なる基底クラスのコンストラクタを使いたい場合には便利です。

罠の数々 §

  • 静的メソッド内から base キーワードを使うとエラーになる。base はthisの特殊なバリエーションなので【このインスタンス】というニュアンスを持つ。インスタンスと関係なく存在する静的なメンバーは対象にできない。その場合は、baseの代わりに基底クラス名を直接書けば良い

参考リンク §

base (C# リファレンス)

サンプルソース: kw_base §

var x = new MyClassB();

class MyClassA

{

    public virtual void Sub() => Console.WriteLine("A.Sub called");

    public MyClassA(string messasge) => Console.WriteLine($"MyClassA's constructor called: {messasge}");

}

class MyClassB : MyClassA

{

    public override void Sub() => Console.WriteLine("B.Sub called");

    public MyClassB() : base("from MyClassB")

    {

        Console.WriteLine("MyClassB's constructor called");

        // 無指定のアクセス

        Sub();

        // thisアクセス

        this.Sub();

        // baseアクセス

        base.Sub();

    }

}

実行結果 §

MyClassA's constructor called: from MyClassB

MyClassB's constructor called

B.Sub called

B.Sub called

A.Sub called

リポジトリ §

https://github.com/autumn009/CSharpPrimer2

練習問題 §

 以下のプログラムの実行結果を予測してみよう。

var x = new C();

class A

{

    public virtual void Sub() => Console.WriteLine("A");

}

class B : A

{

    public override void Sub() => Console.WriteLine("B");

}

class C : B

{

    public override void Sub() => Console.WriteLine("C");

}

class D : C

{

    public override void Sub() => base.base.Sub();

}

  1. A
  2. B
  3. C
  4. コンパイルエラー
  5. 実行時例外

[[解答]]

単行本情報